drop view department;
drop type dept_t;
drop type emp_list;
drop type emp_t;
create or replace type emp_t as object (
  empno number,
  ename varchar2(80),
  sal   number
);
.
/

create or replace type emp_list as table of emp_t;
.
/

create or replace type dept_t as object (
  deptno number, 
  dname varchar2(80),
  loc   varchar2(80),
  employees emp_list
);
.
/

create or replace view department of dept_t
with object OID (deptno)
as select deptno, dname, loc,
          cast(multiset(select empno, ename, sal 
                        from emp 
                        where emp.deptno = dept.deptno
                        ) as emp_list ) employees
     from dept;

create trigger department_ins
instead of insert on department
for each row 
declare
  emps emp_list;
  emp  emp_t;
begin
  -- Insert the master
  insert into dept( deptno, dname, loc ) 
  values (:new.deptno, :new.dname, :new.loc);

  -- Insert the details
  emps := :new.employees;
  for i in 1..emps.count loop
    emp := emps(i);
    insert into emp(deptno, empno, ename, sal)
    values (:new.deptno, emp.empno, emp.ename, emp.sal);
  end loop;
end;
.
/

REM You can post a document like this with the 
REM department object-view as the insert target
REM to insert departments and employees. 
REM 
REM <ROWSET>
REM    <ROW>
REM       <DEPTNO>99</DEPTNO>
REM       <DNAME>ACCOUNTING</DNAME>
REM       <LOC>NEW YORK</LOC>
REM       <EMPLOYEES>
REM          <EMPLOYEES_ITEM>
REM             <EMPNO>1111</EMPNO>
REM             <ENAME>CLARK</ENAME>
REM             <SAL>2450</SAL>
REM          </EMPLOYEES_ITEM>
REM          <EMPLOYEES_ITEM>
REM             <EMPNO>2222</EMPNO>
REM             <ENAME>KING</ENAME>
REM             <SAL>5000</SAL>
REM          </EMPLOYEES_ITEM>
REM          <EMPLOYEES_ITEM>
REM             <EMPNO>3333</EMPNO>
REM             <ENAME>MILLER</ENAME>
REM             <SAL>1300</SAL>
REM          </EMPLOYEES_ITEM>
REM       </EMPLOYEES>
REM    </ROW>
REM </ROWSET>